# -*- coding: utf-8 -*-

'''
Created on 04.11.2009
Dieses Skript zaehlt wie häuftig Woerter in einem als Parameter uebergebenen Text vorkommen. (muss vom
Terminal aus gestartet werden) Das Ergebnis ist eine sortierte Ausgabe der 5 häufigsten Woerter des Textes
im Terminal.

@author: chris
'''


import sys

  
def readFile(file):
    ''' Liest eine Text Datei Zeile für Zeile und gibt den Text als String zurueck.
    
    @param file: Text file
    '''    
    text = ''
    for zeile in file:
        text += zeile
    return text 
    
def replaceSpecialCharacters(string,replaceSymbol):
    ''' Entfernt alle Sonerzeichen aus einem String und ersetzt sich durch einen Parameter
        festgelegten String

    @param string: zu modifizierender String
    @param replaceSymbol: Sonderzeichen werden durch diesen String ersetzt 
    '''    
    specialCharacters =  '!§$%,&/()=?#_@*+.{[]};:<>0123456789'          
    for character in specialCharacters:
        if(character in string):            
            string = string.replace(character, replaceSymbol)    
    return string

def replaceAllUmlauts(string):
    ''' Ersetzt alle Umlaute in einem String durch ihre ASCII Repraesentation
    
    @param string: zu modifizierender String   
    '''
    s = str(string)    
    if('ä' in s):
        s = s.replace('ä', 'ae')
    if('ö' in s):
        s = s.replace('ö','oe')
    if('ü' in s):
        s = s.replace('ü','ue')
    return s

def saveWordsInDictionary(list):
    ''' Alle Woerter in einem Dictionary speichern 
    
    @param list: Liste der im Text vorkommenden Woerter   
    '''
    dic = {}

    for word in list:  # über alle wörter in der liste list iterieren
        if(word in dic):   # wenn das Wort schon im dictionary ist                       
            number = dic.get(word) # die Anzahl holen wie oft das Wort schon vorgekommen ist
            number += 1 # die Anzahl um 1 erhöhen
            dic[word] = number # das wort mit der neuen anzahl dem dictionary hinzufügen
        else:
            dic[word] = 1 # ansonsten das noch unbekannte wort dem dictionary hinzufügen
    return dic

def compareWords((word_1,num_1),(word_2,num_2)):
    ''' Funktion zum Vergleichen von 2 Tupeln bestehend aus (Wort, Anz. Wort)
        Zuerst wird nach der groeßsten Anz. sortiert, falls die Anz. gleich ist
        werden die beiden Wörter verglichen und alphabetisch sortiert
    
    @param word_1: 1. Wort
    @param num_1: Anz. 1. Wort
    @param word_2: 2. Wort
    @param num_2: Anz. 2 Wort   
    '''
    if num_1 < num_2:
        return 1
    elif num_1 > num_2:
        return -1
    elif num_1 == num_2:
        if word_1 < word_2:
            return -1
        elif word_1 > word_2:
            return 1
        return 0
    
def printFinalList(list,numberOfRows,length_outputString):
    ''' Ausgabew der fertigen Liste in der Konsole
        
    @param list: auszugebende Liste
    @param numberOfRows: Anz. der auszugebenden Zeilen
    @param length_outputString: Laenge einer Zeile   
    '''
    
    for key, value in list[:numberOfRows]:
        blanks = ''
        numberOfBlanks = length_outputString-len(key)
        for element in range(0,numberOfBlanks):
                             blanks += ' '                                    
        print key +blanks +str(value)
        

if __name__ == '__main__':
    pass
file = file(sys.argv[1]) #speichere die als parameter uebergebene Textfile in file ab.

text = readFile(file)
urspruenglich = text #fuer die Test Ausgabe
text = replaceSpecialCharacters(text,' ')
text = text.lower()
text = replaceAllUmlauts(text)
list = text.split()
dic = saveWordsInDictionary(list)
list2 = dic.items() #alle woerter mit ihrer Anzahl in einer Liste als Tupel speichern (Wort,Anz),(Wort2,Anz),..
list2.sort(compareWords) #Liste nach der Vergleichsfunktion compareWords sortieren
printFinalList(list2,5,20) #1.param: liste, 2.param: Anz. der auszugeb. Zeilen, 3. param: zeilenbreite 

# Ausgaben zum Testen
#print '----------------------------------------------------------------'
#print '----------------------------------------------------------------'
#print '----------------------------------------------------------------'
#print 'ursprünglicher Text: \n' +urspruenglich
#print '----------------------------------------------------------------'
#print 'Text ohne sonderzeichen,umlaute und in kleinbuchstaben: \n' +text
#print '----------------------------------------------------------------'
#print 'Wörter in einer Liste gespeichert:'
#print list
#print '----------------------------------------------------------------'
#print 'Wörter in einem Dictionray gespeichert mit der jeweiligen Häufigkeit der Wörter:'
#print dic
#print '----------------------------------------------------------------'
#print 'Wörter in einer Liste gespeichert und sortiert: '
#print list2
#print '----------------------------------------------------------------'
#print '----------------------------------------------------------------'
#print '----------------------------------------------------------------'    

   
    


